// 重复显示回调：开始



/**
 * 通过替换目标的 onShow 来让目标支持重复显示回调逻辑 onReShow；
 * 
 * @param target : Page | PageOptions   需要配置重复显示回调的 页面实例 或者 页面选项对象
 * 
 * 注意：
 * 可给页面添加 onReShow 方法，该方法会在页面非第一次显示时调用；同时 原来的 onShow 方法也会正常调用，并且会在 onReShow 之前调用；
 */
function configReShow(target) {

  let oriOnShow = target.onShow;
  target.onShow = function onShow() {
    if (oriOnShow) {
      oriOnShow.apply(this, arguments);
    }

    if (this._hasShown) {
      if (this.onReShow) {
        this.onReShow(...arguments);
      }
    } else {
      this._hasShown = true; //标识已经显示过
    }

  }

}






// 给单个页面配置重复显示回调：开始

/**
 * 给页面实例配置重复显示的逻辑
 * 
 * @param page : Page   需要配置重复显示回调的页面实例
 * 
 * 注意：
 * 可给页面添加 onReShow 方法，该方法会在页面非第一次显示时调用；同时 原来的 onShow 方法也会正常调用，并且会在 onReShow 之前调用；
 */
wx.configReShowForPage = function(page){
  if (!page._hasConfReShow){
    configReShow(page);
    page._hasConfReShow = true; //标识已经配置重复显示逻辑
  }
}

// 给单个页面配置重复显示回调：结束





// 全局配置重复显示回调：开始


/**
 * 通过修复 Page 构造函数 来全局给页面实现 重复显示回调的逻辑
 * 
 * 注意：
 * 可给页面添加 onReShow 方法，该方法会在页面非第一次显示时调用；同时 原来的 onShow 方法也会正常调用，并且会在 onReShow 之前调用；
 */
if (!Page._hasConfReShow) {

  let OriPage = Page;
  Page = function Page(options) {
    configReShow(options);
    return OriPage.apply(this, arguments);
  }

  Page._hasConfReShow = true; //标识已经配置重复显示逻辑
}


// 全局配置重复显示回调：结束




// 重复显示回调：结束